/* cl.ext.formvalue 0.1*/
(
	function (factory) {
		if (typeof define === 'function' && define.amd) {
			define(['jquery'], factory);
		} else if (typeof module === 'object' && module.exports) {
			module.exports = function( root, jQuery ) {
				if ( jQuery === undefined ) {
					if ( typeof window !== 'undefined' ) {
						jQuery = require('jquery');
					}
					else {
						jQuery = require('jquery')(root);
					}
				}
				factory(jQuery);
			};
		} else {
			factory(jQuery);
		}
	}(
	function ($){
		"use strict";
		var defaults= {
			keyName: "name",
			initValue: {},
			ajaxInfo: {},
			initFirstAjax:false,
			beforeCallback:null,
			errUrl:"",
			errCallback:null,
			initCallback: null,
			isRunBind:true
		};
		var arrContainer=["span","lable","div","h1", "h2", "h3", "h4", "h5", "h6", "label", "p","td", "th","li"];
		var $modalCommon={
			getDefaults :function () {
				return defaults
			},
			getOptions : function (elementData,options) {
				options=$.ExtCommon.isCheckEmpty(options)?{}:options;
				var optionBase=$.ExtCommon.initMergeJson(elementData,options);
				optionBase =$.ExtCommon.initMergeJson(this.getDefaults(),optionBase);
				return optionBase
			},
			getElementObj:function(element,keyName){
				var findKey='['+keyName+']';
				return element.find(findKey);
			},
			checkContainer:function(tagname){
				return arrContainer.indexOf(tagname)>-1
			}
		};
		var FormValueExtModal = function (element,options) {
			var self=this;
			self.element = $(element);
			self.optionBase=$modalCommon.getOptions(self.element.data(),options);
			if(self.optionBase.isRunBind){
				self.initBindValue();
			}
		};
		FormValueExtModal.prototype= {
			initBindValue:function() {
				var self = this;
				if (!$.ExtCommon.isCheckEmpty(self.optionBase.ajaxInfo)) {
					var url = self.optionBase.ajaxInfo.url;
					var data = self.optionBase.ajaxInfo.data?self.optionBase.ajaxInfo.data:{};
					$.ExtAjax.initGet({url: url, data: data,
						successCallback: function (result) {
							var dataJson = result.success ? result.data : self.optionBase.initValue;
							if (result.success) {
								self.bindValueData(dataJson);
							}else{
								$.ExtNotify.error(result.msg);
								self.bindValueData({});
							}
						}
					});
				} else   {
					self.bindValueData(self.optionBase.initValue);
				}
			},
			bindValueData:function(json){
				var self = this;
				if(self.optionBase.beforeCallback) {
					self.optionBase.beforeCallback(json)
				}
				self.element.data("originalData",json);
				self.setValues(json);
				if(self.optionBase.initCallback)self.optionBase.initCallback(json);
			},
			getValuesExt:function(elementParent){
				var self=this;
				var jsonName={};
				var key="data-formValue-ext"+self.optionBase.keyName;
				var element=$modalCommon.getElementObj(self.element.find(elementParent),key);
				$.each(element,function(i,item) {
					var _this = $(item);
					var dataKey=self._getValueOne(_this,key);
					if(!$.ExtCommon.isCheckEmpty(dataKey)){jsonName[dataKey.key] = $.trim(dataKey.value);}
				});
				return jsonName;
			},
			_getValueOne:function(elemen,key){
				var json = {};
				key= $.ExtCommon.isCheckEmpty(key)?this.optionBase.keyName:key;
				var name = elemen.attr(key);
				var tagname = elemen.prop('tagName').toLowerCase();
				if(!$modalCommon.checkContainer(tagname)) {
					var value = "";
					if (tagname === "input") {
						var elemenType = elemen.attr("type");
						if (!$.ExtCommon.isCheckEmpty(elemenType)) {
							switch (elemenType) {
								case "radio":
									value = $(":radio[name='" + name + "']:checked").val();
									break;
								case "checkbox":
									var objCheckBox = $(":checkbox[name='" + name + "']:checked");
									value = objCheckBox.length === 1
										? objCheckBox.val()
										: $.map(objCheckBox, function (item) {return $(item).val()}).join(",");
									break;
								case "text":
									value = elemen.val();
									if (elemen.data("ExtNumeric")) {
										value = value.removesplit()
									}
									break;
								case "file":
									if(elemen.data("url")){
										value=elemen.data("url");
									}
									break;
								default:
									value = elemen.val();
							}
						}
					} else if (tagname === "textarea" || tagname === "select") {
						value = elemen.val();
					}
					json={key:name,value:value};
				}
				return json;
			},
			getValues:function(){
				var self=this;
				var jsonName={};
				var elementObj=$modalCommon.getElementObj(self.element,self.optionBase.keyName);
				$.each(elementObj,function(i,item) {
					var _this = $(item);
					var dataKey=self._getValueOne(_this);
					if(!$.ExtCommon.isCheckEmpty(dataKey)){jsonName[dataKey.key] = $.trim(dataKey.value);}
				});
				return jsonName;
			},
			setValues:function(json){
				var self=this;
				if(!$.ExtCommon.isCheckEmpty(json)){
					var elementObj=$modalCommon.getElementObj(self.element,self.optionBase.keyName);
					var arrKeys= $.ExtCommon.getArrByJson(json);
					$.each(elementObj,function(i,item) {
						var _this = $(item);
						var name = _this.attr(self.optionBase.keyName);
						var tagname = _this.prop('tagName').toLowerCase();
						if(arrKeys.indexOf(name)>-1){
							var value = json[name];
							var convertEmpty=_this.data("convertEmpty");
							if(!$.ExtCommon.isCheckEmpty(convertEmpty)){
								if(value===convertEmpty){
									value="";
									json[name]="";
								}
							}
							if($modalCommon.checkContainer(tagname)){
								if(_this.attr("data-formValue-initText")==="false"){
									_this.data("initValue",value);
								}else{
									_this.text(value).data("initValue",value);
								}
							}else if(tagname==="input"){
								var _thisType=_this.attr("type");
								if(!$.ExtCommon.isCheckEmpty(_thisType)){
									switch (_thisType){
										case "radio":
											_this.prop("checked", _this.attr("value")===value.toString()).data("initValue",value.toString());
											break;
										case "checkbox":
											var _thisCheckboxData=_this.data("ExtSwitchery");
											if(_thisCheckboxData){
												if(typeof value ==="boolean" && _this.prop("checked")!==value){
													_thisCheckboxData.click();
												}
											}else{
												_this.prop("checked", _this.attr("value")===value.toString()).data("initValue",_this.attr("value")===value.toString());
											}
											break;
										case "file":
											_this.data("url",value);
											break;
										default:
											if(_this.data("ExtSelect2Tree")){
												_this.data("ExtSelect2Tree").setValue(value,false);
											}else {
												_this.val(value)
											}
											_this.data("initValue", value);
									}
								}else{
									_this.data("url", value);
								}
							}else if(tagname==="textarea"){
								_this.val(value).data("initValue",value);
							}else if(tagname==="select"){
								var _thisSelect2=_this.data("ExtSelect2");
								if(_thisSelect2){
									_thisSelect2.init(value);
									_this.data("initValue",value);
								}else {
									_this.val(value).data("initValue",value);
								}
							}else if(tagname==="img"){
								if(value.length>0){_this.attr("src",value).data("initValue",value)}
							}
						}
					});
				}
			},
			cleanValue:function(json) {
				var self = this;
				var elementObj = $modalCommon.getElementObj(self.element, self.optionBase.keyName);
				var arrKeys= $.ExtCommon.isCheckEmpty(json)?[]: $.ExtCommon.getArrByJson(json);
				$.each(elementObj, function (i, item) {
					var _this = $(item);
					var name = _this.attr(self.optionBase.keyName);
					if(arrKeys.length===0||arrKeys.indexOf(name)>-1){
						var tagname = _this.prop('tagName').toLowerCase();
						if ($modalCommon.checkContainer(tagname)) {
							if(_this.attr("data-formValue-initText")!=="false"){
                                _this.text("");
							}
						} else if (tagname === "input") {
							var _thisType = _this.attr("type");
							if (!$.ExtCommon.isCheckEmpty(_thisType) && _thisType !== "file") {
								switch (_thisType) {
									case "radio":
										_this.prop("checked", false);
										break;
									case "checkbox":
										_this.prop("checked", false);
										break;
									default:
										if(_this.data("ExtSelect2Tree")){
											_this.data("ExtSelect2Tree").setValue("");
										}else{
											_this.val("");
										}
								}
							}
						} else if (tagname === "textarea") {
							_this.val("");
						} else if (tagname === "select") {
							var _thisSelect2 = _this.data("ExtSelect2");
							if (_thisSelect2) {
								_thisSelect2.init("");
							} else {
								_this.val("");
							}
						}
					}
				});
			},
			replaceData:function(data){
				this.optionBase.data=data;
				this.cleanValue();
				this.bindValueData(data);
			},
			getOriginalData:function(){
				return this.element.data("originalData");
			}
		};
		$.fn.ExtFormValue = function(options) {
			var dataFun;
			this.each(function() {
				var el = $(this);
				var tempData=el.data('ExtFormValue');
				if (tempData) {
					if (typeof  options === "string") {
						if (tempData[options]) {
							dataFun =tempData[options]()
						} else {
							dataFun = tempData
						}
					} else {
						dataFun = tempData
					}
				} else {
					dataFun = new FormValueExtModal(el, options);
					el.data('ExtFormValue', dataFun);
				}
			});
			return dataFun;
		};

	})
);